﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;
using HerGoS.Administration.Entities;
using HerGoS.Administration.Engine;
using HerGoS.Viaticos.Entities;
using HerGoS.Viaticos.Engine;
using HerGoS.ControlsUI;
using HerGoS.WebControlExtend;
using HerGoS.Interfaces;

namespace HerGoS.WebUI.Viaticos
{
    public partial class Solicitud_ABM : PageBase
   {
        
        [WebMethod]
        public static PersonaSolicitud GetPersonaByDNI(string dni)
        {
            return GestorPersona.ConsultaPersonasPorDNI(dni);
         
        }
       //[WebMethod]
       // public static PersonaSolicitud GetPersonaByApellido(string apellidos)
       // {

       //     return GestorPersona.GetPersonasPorApellido(apellidos).FirstOrDefault();
         
       // }
       
        [WebMethod]
       public static List<Persona> ListarPersonasByApellidos(string prefixText)
       {
           //int count = 15;
           //List<PersonaSolicitud> itemsResults = new List<PersonaSolicitud>(count);
           //itemsResults = GestorPersona.ListarPersonasPorApellido(prefixText);
           //return itemsResults;
           var res = GestorPersona.GetPersonasPorApellido(prefixText);
           return res;
       }


        [WebMethod]
        public static bool HabilitarKmRecorridos(int idtransporte)
        {
            List<Transporte> listaTransporte = HttpContext.Current.Session["TipoTransporte"] as List<Transporte>;

            var result = listaTransporte.Find(y => y.OID == idtransporte);

            return result.CALCULOKMS;

        }



        [WebMethod]
        public static decimal ObtenerTarifaDestino(string idciudad)
        {
           var ciudadDestino = GestorCiudad.Obtener(idciudad.ToInteger());

           return ciudadDestino.TarifaViatico; 

            

        }



        #region Propiedades
       
        public Solicitud Solicitud
        {
            get
            {
                if (ViewState["solicitud"] != null)
                  return (Solicitud)ViewState["solicitud"];
                return null;
            }
            set
            {
                ViewState["solicitud"] = value;
            }
        
        }
        
    

        public int Contador
        {
            get
            {
                if (ViewState["contador"] != null)
                    return (int)ViewState["contador"];
                return 0;
            }
            set
            {
                ViewState["contador"] = value;
            }
        }

        public bool TieneRendicion
        {
            get
            {
                if (ViewState["tienerendicion"] != null)
                    return (bool)ViewState["tienerendicion"];
                return false;
            }
            set
            {
                ViewState["tienerendicion"] = value;
            }
        }






        #endregion

        
        protected void Page_Load(object sender, EventArgs e)
        {
            Page.MaintainScrollPositionOnPostBack = true;
            
            if (!Page.IsPostBack)
            {
                this.btnAnticipo.Visible = false;
                LoadCombos();
                
                if (Request.QueryString["id"] == null)
                {
                    Solicitud = new Solicitud();
                    this.txtKmRecorridos.Text = "0";
                    this.btnRendicion.Visible = false;
                    this.lblRendicionExistente.Visible = false;
                    this.lblAnticipoExistente.Visible = false;

                }
                else
                {
                    var Id = Convert.ToInt32(Request.QueryString["id"]);

                    //  carga datos de solicitud
                    Solicitud = GestorSolicitudes.Obtener(Id);
                    txtNumero.Text = Solicitud.Numero.ToString();
                    hidPersona.Value = Solicitud.Persona.OID.ToString();
                    Persona persona = Solicitud.Persona;
                    txtDNI.Text = persona.DNI;
                    txtApyNombre.Text = persona.NombresYApellidos;
                    txtCuit.Text = persona.Cuit;
                    txtFechaNac.Text = persona.FechaNacimiento == null? null:persona.FechaNacimiento.Value.ToShortDateString();

                    this.cboArea.SelectedValue = Solicitud.Area == null ? "0" : Solicitud.Area.OID.ToString();
                    this.cboEntidad.SelectedValue = Solicitud.Entidad == null ? "0" : Solicitud.Entidad.OID.ToString(); ;
                    this.txtFechaSalida.Text = Solicitud.FechaSalida.Value.ToShortDateString();
                    this.txtFechaRetorno.Text = Solicitud.FechaRetorno.Value.ToShortDateString();
                    this.txtMotivo.Text = Solicitud.Motivo;
                    this.cboDistancia.SelectedValue = Solicitud.Distancia == null ? "0" : Solicitud.Distancia.OID.ToString();
                    this.txtObservacion.Text = Solicitud.Observaciones;
                    this.chkSolViaticos.Checked = Solicitud.SolicitaViaticos;
                    this.txtEvento.Text = Solicitud.EventoNombre;
                    this.txtFechaEvento.Text = Solicitud.FechaEvento == null ? null : Solicitud.FechaEvento.Value.ToShortDateString();
                   
                    
                    TieneRendicion = GestorSolicitudes.SolicitudTieneRendicion(Solicitud);
                    this.btnRendicion.Visible = !TieneRendicion;
                    this.lblRendicionExistente.Visible = TieneRendicion;
                    this.lblAnticipoExistente.Visible = GestorSolicitudes.SolicitudTieneAnticipo(Solicitud);
                    this.btnAnticipo.Visible = !this.lblAnticipoExistente.Visible;
                    //this.lblLiquidacionExistente.Visible = false;
                }
                Initialize();
            }

        }

        void Initialize()
        {
            this.btnGuardar.Settings(new ButtonExtText());
            this.btnCerrar.Settings(new ButtonExtText());

            this.GridTramos.Settings(new GridViewExtBasic());
            this.GridTramos.AllowPaging = false;
            this.btn_AgregarTramo.Settings(new ButtonExtText());
            this.btn_Cerrar_dialog_tramo.Settings(new ButtonExtText());
            this.btn_DialogTramos.Settings(new ButtonExtText());
            this.btnRendicion.Settings(new ButtonExtText());
            this.btnAnticipo.Settings(new ButtonExtText());
            LoadAutoria(Solicitud);
            LoadGridTramos();
        }

        private void LoadGridTramos()
        {
            GridTramos.DataSource = GestorTramo.Activos(Solicitud);
            GridTramos.DataBind();
        }

        private void LoadCombos()
        {
            this.cboArea.DataSource = GestorArea.Consultar();
            cboArea.DataTextField = "Descripcion";
            cboArea.DataValueField = "OID";
            cboArea.DataBind();
            cboArea.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));

            this.cboEntidad.DataSource = GestorEntidades.Consultar();
            cboEntidad.DataTextField = "Denominacion";
            cboEntidad.DataValueField = "OID";
            cboEntidad.DataBind();
            cboEntidad.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));
            
            var ListaTransporte = new List<Transporte>();
            ListaTransporte = GestorTransporte.Consultar();
            Session["TipoTransporte"] = ListaTransporte;

            this.cbTransporte.DataSource = ListaTransporte;
            cbTransporte.DataTextField = "Descripcion";
            cbTransporte.DataValueField = "OID";
            cbTransporte.DataBind();
            cbTransporte.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));


            this.cboCiudad.DataSource = GestorCiudad.Consultar();
            cboCiudad.DataTextField = "Nombre";
            cboCiudad.DataValueField = "OID";
            cboCiudad.DataBind();
            cboCiudad.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));


            this.cboCiudadDestino.DataSource = GestorCiudad.Consultar();
            cboCiudadDestino.DataTextField = "Nombre";
            cboCiudadDestino.DataValueField = "OID";
            cboCiudadDestino.DataBind();
            cboCiudadDestino.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));

            this.cboPorcViatico.DataSource = GestorViaticos.ConsultarPorcentajeViatico();
            this.cboPorcViatico.DataTextField = "Valor";
            this.cboPorcViatico.DataValueField = "Valor";
            cboPorcViatico.DataBind();
            //cboPorcViatico.Items.Insert(6, new ListItem("--Seleccione-- ","-1"));

            this.cboDistancia.DataSource = GestorDistancia.Consultar();
            this.cboDistancia.DataTextField = "Descripcion";
            this.cboDistancia.DataValueField = "OID";
            cboDistancia.DataBind();
            cboDistancia.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));


        }


        protected void btn_AgregarTramo_Click(object sender, EventArgs e)
        {
            try
            {
            
                int idtramo = hidIdTramo.Value.ToInteger();
                if (idtramo != 0)
                {
                    //if (Solicitud.Tramos.Count >= 1)
                    //{
                    //   var ultimoTramo = Solicitud.Tramos.Last();
                    //   if (ultimoTramo.OID != idtramo)
                    //   {
                    //       if (Convert.ToDateTime(txtFechaDestino.Text + " " + this.txtHoraDestino.Text) > )
                    //       { }
                    //   }
                    
                    //}
                


                    foreach (var item in Solicitud.Tramos.Where(x => x.OID == idtramo))
                    {
                        item.Transporte = GestorTransporte.Obtener(this.cbTransporte.SelectedValue.ToInteger());
                        item.PorcentajeViatico = Convert.ToDecimal(cboPorcViatico.SelectedValue);
                        item.CiudadOrigen = GestorCiudad.Obtener(this.cboCiudad.SelectedValue.ToInteger());
                        item.FechaOrigen = Convert.ToDateTime(txtFechaOrigen.Text + " " + txtHora.Text);
                        item.NroServicioOrigen = this.txtNroServicioOrigen.Text;
                        item.CodigoOrigen = this.txtCodigoOrigen.Text;
                        item.ObservacionOrigen = txtObservacionOrigen.Text;
                        item.CiudadDestino = GestorCiudad.Obtener(cboCiudadDestino.SelectedValue.ToInteger());
                        item.FechaDestino = Convert.ToDateTime(this.txtFechaDestino.Text + " " + this.txtHoraDestino.Text);
                        //item.NroServicioDestino = "NO APLICABLE";
                        //item.CodigoDestino = "NO APLICABLE"; //TODO:BORRAR DE LA BD
                        item.ObservacionDestino = this.txtObservacionesDestino.Text;
                         
                        item.MontoTerminalOrigenIda = item.CiudadOrigen.TarifaTerminal;
                        item.MontoTerminalDestinoIda = item.CiudadDestino.TarifaTerminal;
                     
                        if (!TieneRendicion)
                        {
                            item.TarifaDiariaDestino = txtTarifaViaticoDestino.Text.ToDecimal();
                        }
                        else
                        {
                             item.TarifaDiariaDestino = item.CiudadDestino.TarifaViatico;
                        }
                        item.kmRecorridos = this.txtKmRecorridos.Text == string.Empty ? 0 : Convert.ToDecimal(txtKmRecorridos.Text);
                    }

                    LoadGridTramos();
                    hidIdTramo.Value = "0";
                }
                else
                {
                    //solo valido en el Alta.
                    if (Solicitud.Tramos.Count >= 1)
                    {
                        var ultimoTramo = Solicitud.Tramos.Last();
                        if (ultimoTramo.FechaDestino.Value > Convert.ToDateTime(txtFechaOrigen.Text + " " + txtHora.Text))
                        {
                            //tirar alerta.
                            string script = @"$(function(){{parent.FechaorigenMayor();}});";

                            script = string.Format(script, Solicitud.OID.ToString());

                            ScriptManager.RegisterStartupScript(Page, typeof(Page), "fechaOrigen", script, true);
                            return;
                        }
                    }

                    
                    Tramo tramo = new Tramo();
                    tramo.Transporte = GestorTransporte.Obtener(this.cbTransporte.SelectedValue.ToInteger());
                    tramo.PorcentajeViatico = Convert.ToDecimal(cboPorcViatico.SelectedValue);
                    tramo.CiudadOrigen = GestorCiudad.Obtener(this.cboCiudad.SelectedValue.ToInteger());
                    tramo.FechaOrigen = Convert.ToDateTime(txtFechaOrigen.Text + " " + txtHora.Text);
                    tramo.NroServicioOrigen = this.txtNroServicioOrigen.Text;
                    tramo.CodigoOrigen = this.txtCodigoOrigen.Text;
                    tramo.ObservacionOrigen = txtObservacionOrigen.Text;
                    tramo.CiudadDestino = GestorCiudad.Obtener(cboCiudadDestino.SelectedValue.ToInteger());
                    tramo.FechaDestino = Convert.ToDateTime(this.txtFechaDestino.Text + " " + this.txtHoraDestino.Text);
                    // noroservicio destino y codigo destino no estan en el abm de tramos no se aplican.
                    //tramo.NroServicioDestino = 
                    //tramo.CodigoDestino = 
                    tramo.ObservacionDestino = this.txtObservacionesDestino.Text;
                    tramo.kmRecorridos = this.txtKmRecorridos.Text == string.Empty ? 0: Convert.ToDecimal(txtKmRecorridos.Text);

                    tramo.MontoTerminalOrigenIda = tramo.CiudadOrigen.TarifaTerminal;
                    tramo.MontoTerminalDestinoIda = tramo.CiudadDestino.TarifaTerminal;

                    tramo.TarifaDiariaDestino = txtTarifaViaticoDestino.Text.ToDecimal();
                    
                    Contador = Contador - 1;
                    tramo.OID = Contador;
                    Solicitud.Tramos.Add(tramo);
                    LoadGridTramos();
                }

                this.cbTransporte.SelectedValue = "0";
                this.cboPorcViatico.SelectedValue = "0";
                this.cboCiudad.SelectedValue = "0";
                this.txtFechaOrigen.Text = string.Empty;
                this.txtHora.Text = string.Empty;
                this.txtNroServicioOrigen.Text = string.Empty;
                this.txtCodigoOrigen.Text = string.Empty;
                this.txtObservacionOrigen.Text = string.Empty;
                this.cboCiudadDestino.SelectedValue = "0";
                this.txtFechaDestino.Text = string.Empty;
                this.txtHoraDestino.Text = string.Empty;
                this.txtObservacionesDestino.Text = string.Empty;
                this.txtKmRecorridos.Text = string.Empty;
            }
           
            catch (Exception ex)
            { }


        }

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                Solicitud.Numero = this.txtNumero.Text.ToInteger();
                Solicitud.Persona = GestorPersona.Obtener(hidPersona.Value.ToInteger());
                Solicitud.Area = GestorArea.Obtener(cboArea.SelectedValue.ToInteger());
                Solicitud.Entidad = GestorEntidades.Obtener(cboEntidad.SelectedValue.ToInteger());
                Solicitud.Distancia =this.cboDistancia.SelectedValue == "0"? null : GestorDistancia.Obtener(this.cboDistancia.SelectedValue.ToInteger());
                Solicitud.FechaSalida = this.txtFechaSalida.Text.ToNullableDateTime();
                Solicitud.FechaRetorno = this.txtFechaRetorno.Text.ToNullableDateTime();
                //Solicitud.Mail = this.txtMail.Text;
                Solicitud.Motivo = this.txtMotivo.Text;
                Solicitud.EventoNombre = this.txtEvento.Text;
                Solicitud.FechaEvento =  txtFechaEvento.Text.ToNullableDateTime();
                Solicitud.Observaciones = this.txtObservacion.Text;
                Solicitud.SolicitaViaticos = this.chkSolViaticos.Checked;
                GestorSolicitudes.Guardar(Solicitud);
                Solicitud = GestorSolicitudes.Obtener(Solicitud.OID);
                this.txtNumero.Text = Solicitud.Numero.ToString();
                this.txtCuit.Text = Solicitud.Persona.Cuit;

                if (chkSolViaticos.Checked)
                {
                   //controlar que solicitud no tiene anticipo
                    this.btnAnticipo.Visible = !GestorSolicitudes.SolicitudTieneAnticipo(Solicitud);
                    lblAnticipoExistente.Visible = GestorSolicitudes.SolicitudTieneAnticipo(Solicitud); 
                }



                var numero = this.txtNumero.Text;
                string script = @"$(function(){{parent.IntervaloCerrarPopup('{0}');}});";

                script = string.Format(script, numero);
                this.btnRendicion.Visible = !GestorSolicitudes.SolicitudTieneRendicion(Solicitud);
                ScriptManager.RegisterStartupScript(Page, typeof(Page), "closedialog", script, true);
            }

            catch (Exception ex)
            { }

        }


        protected void GridTramos_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                ImageButtonExt Borrar = e.Row.FindControl("btnBorrar") as ImageButtonExt;
                if (Borrar != null)
                {
                    Borrar.Settings(new ImageButtonExtDelete());
                }

            }

            ImageButtonExt Editar = e.Row.FindControl("btnEditar") as ImageButtonExt;
            if (Editar != null)
            {

                Editar.Settings(new ImageButtonExtEdit());
               
            }

        }



        protected void GridTramos_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Borrar")
            {
                int index = Convert.ToInt32(e.CommandArgument);
                int id = Convert.ToInt32(GridTramos.DataKeys[index].Value);


                if (id > 0)
                {
                    Tramo tramo = Solicitud.Tramos.Where(x => x.OID == id).FirstOrDefault();
                    tramo.Persistencia = EstadoPersistencia.DELETE;

                }
                else
                {
                    Solicitud.Tramos.RemoveAt(index);

                }
                LoadGridTramos();
            }
              if (e.CommandName == "Editar")
            {
                int index = Convert.ToInt32(e.CommandArgument);
                int oid = Convert.ToInt32(GridTramos.DataKeys[index].Value);
                 hidIdTramo.Value = oid.ToString();
                Tramo tramo;
                tramo = Solicitud.Tramos.Find(y => y.OID == oid);

                this.cbTransporte.SelectedValue = tramo.Transporte.OID.ToString();
                this.cboPorcViatico.SelectedValue = tramo.PorcentajeViatico == 0 ? "0" : Convert.ToString(tramo.PorcentajeViatico);
                cboCiudad.SelectedValue = tramo.CiudadOrigen == null ? "0" : tramo.CiudadOrigen.OID.ToString();
                string hora = tramo.FechaOrigen.Value.ToString("HH:mm");
                this.txtFechaOrigen.Text = tramo.FechaOrigen.Value.ToShortDateString();
                this.txtHora.Text = hora;
                this.txtNroServicioOrigen.Text = tramo.NroServicioOrigen;
                this.txtCodigoOrigen.Text = tramo.CodigoOrigen;
                this.txtObservacionOrigen.Text = tramo.ObservacionOrigen;
                cboCiudadDestino.SelectedValue = tramo.CiudadDestino == null ? "0" : tramo.CiudadDestino.OID.ToString();
                string horaDestino = tramo.FechaDestino.Value.ToString("HH:mm");
                this.txtFechaDestino.Text = tramo.FechaDestino.Value.ToShortDateString();
                this.txtHoraDestino.Text = horaDestino;
                this.txtObservacionesDestino.Text = tramo.ObservacionDestino;
                this.txtKmRecorridos.Text = tramo.kmRecorridos.ToString();
                this.txtTarifaViaticoDestino.Text = tramo.TarifaDiariaDestino.ToString();
               
                if (!TieneRendicion)
                {
                    this.txtTarifaViaticoDestino.Enabled = true;
                }
                else
                {
                    this.txtTarifaViaticoDestino.Enabled = false;

                }

                
                UpdatePanel3.Update();

                ScriptManager.RegisterStartupScript(Page, typeof(Page), "Edicion", "Editar(); ", true);
            }


        }

        protected void btnRendicion_Click(object sender, EventArgs e)
        {
            string script = @"$(function(){{parent.GenerarRendicionFromSolicitud('{0}','{1}');}});";

            script = string.Format(script,Solicitud.Numero,Solicitud.OID.ToString());

            ScriptManager.RegisterStartupScript(Page, typeof(Page), "rendicion", script, true);
            
           
        }


    
        protected void btnAnticipo_Click(object sender, EventArgs e)
        {
            string script = @"$(function(){{parent.GenerarLiquidacionFromSolicitud('{0}');}});";

            script = string.Format(script,Solicitud.OID.ToString());

            ScriptManager.RegisterStartupScript(Page, typeof(Page), "liquidacion", script, true);


        }


    }
}